perm filename DISKLA[MLI,LSP] blob
sn#010969 filedate 1975-06-03 generic text, type T, neo UTF8
(OPS HRR 540000 HRL 504000 HRLZ 514000 HRRM@ 542020 SETZM 402000 SETZM@ 402020 XCT 256000 EXCH 250000
ADDI 271000 SUBI 275000 IMUL 220000 XOR 430000 ROT 241000 LDB 135000 DPB 137000
SOJE 362000 SOJL 361000 CAMLE 313000 SKIPN 336000 X 0 INUM0 577777
USETI 074000 USETO 075000 UGETF 073000)
(LAP UREAD SUBR) ~ (UREAD RECORD#) - RECORD# MUST BE IN MACHINE REP.
(SETZM@ 0 X) ~ [TYIA:OLDCH] MAKE SURE READ DOES AN INPUT
(SETZM@ 0 X) ~ [TYI2:CHARACTER COUNT] TO FILL A NEW BUFFER.
(LDB 2 PTR1:) ~ SET UP THE CHANNEL NUMBER FOR THE USETI CALL.
(DPB 2 PTR2:)
USETI: (USETI X 0 1)
(JCALL 0 (E READ))
PTR1: (270400 0 X) ~ (PTR ACFIELD 4 [TYI2X:CHANNEL NUMBER])
PTR2: (270400 0 USETI:) ~ (PTR ACFIELD 4 USETI:)
NIL
(LAP UPRINT SUBR) ~ (UPRINT SEXP RECORD#) - RECORD# MUST BE IN MACHINE REP.
(XCT 0 X) ~ [TYO2X:[OUT X,]] - MAKE SURE THE PRINT BUFFER IS EMPTY.
(LDB 3 PTR1:) ~ SET UP THE CHANNEL NUMBER FOR THE USETO CALL.
(DPB 3 PTR2:)
USETO: (USETO X 0 2)
(JCALL 1 (E PRINT))
PTR1: (270400 0 X) ~ (PTR ACFIELD 4 [TYO2X:CHANNEL NUMBER])
PTR2: (270400 0 USETO:) ~ (PTR ACFIELD 4 USETI:)
NIL
(LAP UGETF SUBR) ~ (UGETF) - RETURN MACHINE REP. FOR NEXT RECORD TO WRITE ON.
(XCT 0 X) ~ [TYO2X:[OUT X,]] - MAKE SURE THE PRINT BUFFER IS EMPTY.
(XCT 0 X) ~ [TYO2X:[OUT X,]] - MAKE DAMN SURE!
(LDB 1 PTR1:) ~ SET UP THE CHANNEL NUMBER FOR THE UGETF CALL.
(DPB 1 PTR2:)
(MOVEI 1 0)
UGETF: (UGETF X 1)
(POPJ P)
PTR1: (270400 0 X) ~ (PTR ACFIELD 4 [TYO2X:CHANNEL NUMBER])
PTR2: (270400 0 UGETF:) ~ (PTR ACFIELD 4 UGETF:)
NIL
(LAP HASH_GET SUBR) ~ (HASH_GET ATOM)
(CALL 1 (E HASH))
(HLRZ 2 1) ~ 1ST HASH.
(ADD 2 (SPECIAL !HASH_TABLE_BASE)) ~ ADD IT TO THE BASE OF THE HASH TABLE.
(HRRZ 1 1) ~ 2ND HASH.
(MOVE 3 (SPECIAL !HASH_MAX)) ~ MAX # OF SUCCESSIVE LOCATIONS TO LOOK IN.
LOOP: (HLRZ 4 0 2) ~ GET THE HASH TABLE ENTRY.
(CAMN 1 4) ~ SECOND HASHES MATCH?
(JCALL 3 (E HASH_SAVE)) ~ YES, WE'RE DONE.
(SOJL 3 NOPE:) ~ NO, KEEP GOING?
(ADDI 2 1) ~ YES.
(CAMLE 2 (SPECIAL !HASH_TABLE_TOP)) ~ WRAP AROUND?
(MOVE 2 (SPECIAL !HASH_TABLE_BASE)) ~ YES, GO BACK TO THE BEGINNING.
(JRST 0 LOOP:)
NOPE: (MOVEI 1 (QUOTE NIL)) ~ RETURNS NIL IF ENTRY NOT FOUND.
(POPJ P)
NIL
(LAP HASH_PUT SUBR) ~ (HASH_PUT ATOM VALUE)
(PUSH P 2)
(CALL 1 (E HASH))
(HLRZ 2 1) ~ 1ST HASH.
(ADD 2 (SPECIAL !HASH_TABLE_BASE)) ~ ADD IT TO THE BASE OF THE HASH TABLE.
(HRLZ 1 1) ~ PUT THE 2ND HASH IN THE LEFT HALF.
(HRR 1 0 P) ~ NOW 1 = [2ND HASH, VALUE]
(SUB P (C 0 0 1 1))
(MOVE 3 (SPECIAL !HASH_TABLE_MSIZE)) ~ MAX # OF SUCCESSIVE LOCATIONS TO LOOK IN.
LOOP: (SKIPN 0 0 2) ~ HASH TABLE LOCATION EMPTY (= 0) ?
(JRST 0 FOUND:) ~ YES.
(SOJE 3 NOPE:) ~ NO, KEEP GOING?
(ADDI 2 1) ~ YES.
(CAMLE 2 (SPECIAL !HASH_TABLE_TOP)) ~ WRAP AROUND?
(MOVE 2 (SPECIAL !HASH_TABLE_BASE)) ~ YES, GO BACK TO THE BEGINNING.
(JRST 0 LOOP:)
FOUND: (MOVEM 1 0 2) ~ PUT THE VALUE IN THE HASH TABLE LOCATION.
(HRRZ 1 1) ~ RETURNS THE VALUE PUT IN THE TABLE IF SUCCESSFUL.
(MOVE 2 (SPECIAL !HASH_TABLE_MSIZE)) ~ COMPUTE # OF SUCCESSIVE LOCATIONS WE HAD TO LOOK IN.
(SUB 2 3)
(CAMLE 2 (SPECIAL !HASH_MAX)) ~ LARGEST NUMBER SO FAR?
(MOVEM 2 (SPECIAL !HASH_MAX)) ~ YES.
(POPJ P)
NOPE: (MOVEI 1 (QUOTE NIL)) ~ RETURNS NIL IF VALUE COULD NOT BE PUT IN TABLE.
(POPJ P)
NIL
(LAP HASH SUBR) ~ (HASH ATOM) - RETURNS [1ST HASH, 2ND HASH]
(MOVEI 2 (QUOTE PNAME))
(CALL 2 (E GET)) ~ GET THE PRINTNAME OF THE ATOM.
(MOVEI 2 0) ~ 2 WILL HOLD: P1⊗P2⊗...⊗Pn, Pi = iTH PRINTNAME WORD.
LOOP: (HLRZ@ 3 1) ~ CAR PRINTNAME.
(HRRZ@ 1 1) ~ CDR PRINTNAME.
(ROT 2 1) ~ ROTATE THE TOTAL LEFT ONE BIT TO OFFSET IT.
(XOR 2 0 3) ~ EXCLUSIVE-OR THE ASCII INTO THE TOTAL.
(JUMPN 1 LOOP:)
(MOVE 1 2) ~ NOW 1 CONTAINS P1⊗P2⊗...Pn
(PUSH P 1)
(CALL 1 (E HASH1)) ~ 1ST HASH.
(EXCH 1 0 P)
(CALL 1 (E HASH2)) ~ 2ND HASH.
(HRL 1 0 P) ~ [1ST HASH, 2ND HASH]
(SUB P (C 0 0 1 1))
(POPJ P)
NIL
(LAP HASH1 SUBR) ~ (HASH1 WORD) - RETURNS AN 11-BIT HASH.
(IMUL 1 (C 352042 0 223027)) ~ X*PIE
(ADD 1 (C 312416 0 161755)) ~ X*PIE + E
(LDB 1 (C 311300 0 1)) ~ (PTR 36-11 11 1) - CHANGE THIS IF HASH TABLE SIZE CHANGES.
(POPJ P)
NIL
(LAP HASH2 SUBR) ~ (HASH2 WORD) - RETURNS AN 18-BIT HASH.
(IMUL 1 (C 312416 0 161755)) ~ X*E
(ADD 1 (C 352042 0 223027)) ~ X*E + PIE
(LDB 1 (C 222200 0 1)) ~ (PTR 36-18 18 1)
(POPJ P)
NIL
(LAP HASH_CONTINUE SUBR) ~ CONTINUES WHERE THE LAST HASH_GET LEFT OFF.
(MOVE 1 (SPECIAL !HASH_SAVE1)) ~ RESTORE AC'S 1-3.
(MOVE 2 (SPECIAL !HASH_SAVE2))
(MOVE 3 (SPECIAL !HASH_SAVE3))
LOOP: (SOJL 3 NOPE:) ~ KEEP GOING?
(ADDI 2 1) ~ YES.
(CAMLE 2 (SPECIAL !HASH_TABLE_TOP)) ~ WRAP AROUND?
(MOVE 2 (SPECIAL !HASH_TABLE_BASE)) ~ YES, GO BACK TO THE BEGINNING.
(HLRZ 4 0 2) ~ GET THE HASH TABLE ENTRY.
(CAME 1 4) ~ 2ND HASHES MATCH?
(JRST 0 LOOP:) ~ NO.
(JCALL 3 (E HASH_SAVE))
NOPE: (MOVEI 1 (QUOTE NIL)) ~ RETURNS NIL IF ENTRY NOT FOUND.
(POPJ P)
NIL
(LAP HASH_SAVE SUBR) ~ SAVES THE AC'S AND RETURNS THE HASH TABLE VALUE.
(MOVEM 1 (SPECIAL !HASH_SAVE1))
(MOVEM 2 (SPECIAL !HASH_SAVE2))
(MOVEM 3 (SPECIAL !HASH_SAVE3))
(HRRZ 1 0 2) ~ GET THE HASH TABLE VALUE.
(POPJ P)
NIL
(LAP DEPOSIT_RH SUBR) ~ (DEPOSIT_RH LOCATION VALUE)
(PUSH P 2)
(CALL 1 (E NUMVAL))
(EXCH 1 0 P)
(CALL 1 (E NUMVAL))
(POP P 2)
(HRRM@ 1 2)
(POPJ P)
NIL